• 问题

    先来看一个反例:

    Vector<User> list= new Vector<User>();
    

    大多数情况下,我们都喜欢用具体的类型来声明变量,这里有一个弊端,如果将来想将Vector换成ArrayList的话,可能会影响其他的代码。在声明变量是最佳的实践是什么?

  • 解决

    像上例中采用接口的方式声明变量更加合适,如:

     List<User> list= new ArrayList<User>();
    

    具有的优点:程序更加灵活,如果其他代码使用的是List接口中的方法,当你想改变具体实现类的时候,比如这里将Vector换成了ArrayList,只需要改变构造器就可以,对其他地方的代码而言是无感知的,并不会影响其他地方的操作。

    • 什么时候应该让具体类去声明变量呢?
      1. 如果没有合适的接口存在,可以用类来引用对象。例如,考虑值类(String、BigInteger)很少用多个实现编写,他们通常是final的,并且很少有对应的接口。使用这种值类作为参数、变量、域或者返回值类型就比较合适;
      2. 顶层类是抽象类的情况, 例如java.util.TimerTask抽象类,应该用相关的基类(往往是抽象类)来引用对象,而不是它的实现类;
      3. 代码依赖于具体类的特殊属性,比如上例中假设程序中需要利用Vector的线程安全的特性,如果采用接口声明变量的话,无意间将实现类改成了ArrayList就会造成极大的错误。
  • 结论

    如果有合适的接口类型存在,那么对于参数、返回值、变量和域来说,都应该使用接口类型进行声明。这样做可以让程序变得更加灵活,如果改变接口的具体实现类,其他代码都可以继续工作。

results matching ""

    No results matching ""